<?php
namespace App\Domain\Fcjd;

class Tags {
    /**
     * 缓存键前缀
     */
    const CACHE_KEY_PREFIX = 'phone_tags_type_';
    
    /**
     * 缓存时间（1天）
     */
    const CACHE_EXPIRE = 86400;

    /**
     * 获取游戏标签（保留原有方法作为默认游戏标签获取）
     * @return array
     */
    public function getGameTags() {
        return $this->getTagsByType('游戏');
    }



    /**
     * 获取指定类型的所有标签数据（从缓存或数据库）
     * 
     * @param string $tagName 标签类型名称
     * @return array 该类型的所有标签数据
     */
    public function getAllTagsByTypeForBD($tagName) {

            
        $cacheKey = self::CACHE_KEY_PREFIX . $tagName;
        $cache = \PhalApi\DI()->cache;
        // // 尝试从缓存获取数据
        $tags = $cache->get($cacheKey);

        if ($tags === NULL) {
            // 将标签类型字符串分割成数组
            $tagTypes = explode(',', $tagName);
            $tagTypes = array_map('trim', $tagTypes); // 去除空格

            $tags=array();
            foreach( $tagTypes as $key => $value ){
                $tags[$value] = \PhalApi\DI()->notorm->phone_tags
                                ->select('*')
                                ->where('types', $value)
                                ->fetchAll();
            }

            if (!empty($tags)) {
                // 计算当前时间到当天24点的秒数
                $now = time();
                $midnight = strtotime('tomorrow');
                $secondsUntilMidnight = $midnight - $now;
                
                // 设置缓存，过期时间为到当天24点
                $cache->set($cacheKey, $tags, $secondsUntilMidnight);
            }
        }
        
        return $tags ?: [];
    }


    /**
     * 获取指定类型的所有标签数据（从缓存或数据库）
     * 
     * @param string $tagName 标签类型名称
     * @return array 该类型的所有标签数据
     */
    protected function getAllTagsByType($tagName) {
        $cacheKey = self::CACHE_KEY_PREFIX . $tagName;
        $cache = \PhalApi\DI()->cache;
        
        // 尝试从缓存获取数据
        $tags = $cache->get($cacheKey);
        
        if ($tags === NULL) {
            // 缓存未命中，从数据库获取
            $tags = \PhalApi\DI()->notorm->phone_tags
                ->select('*')
                ->where('types', $tagName)
                ->fetchAll();
                
            // 存入缓存
            if (!empty($tags)) {
                $cache->set($cacheKey, $tags, self::CACHE_EXPIRE);
            }
        }
        
        return $tags ?: [];
    }

    /**
     * 从数组中随机获取指定数量的元素
     * 
     * @param array $array 源数组
     * @param int $count 需要获取的数量
     * @return array 随机获取的元素数组
     */
    protected function getRandomElements($array, $count) {
        $count = min(count($array), $count);
        if ($count <= 0) {
            return [];
        }
        
        $keys = array_rand($array, $count);
        if (!is_array($keys)) {
            $keys = [$keys];
        }
        
        $result = [];
        foreach ($keys as $key) {
            $result[] = $array[$key];
        }
        return $result;
    }

    /**
     * 根据tag_name获取对应类型的标签
     * 
     * @param string $tagName 标签类型名称，多个类型用逗号分隔
     * @return array 返回随机标签
     */
    public function getTagsByType($tagName) {
        // 将标签类型字符串分割成数组
        $tagTypes = explode(',', $tagName);
        $tagTypes = array_map('trim', $tagTypes); // 去除空格
        
        // 计算每个类型需要获取的标签数量
        $typeCount = count($tagTypes);
        $tagsPerType = ceil(20 / $typeCount); // 平均分配，向上取整
        
        $allResults = [];
        foreach ($tagTypes as $type) {
            // 获取该类型的所有标签
            $typeTags = $this->getAllTagsByType($type);
            
            // 从该类型中随机获取标签
            $typeResults = $this->getRandomElements($typeTags, $tagsPerType);
            $allResults = array_merge($allResults, $typeResults);
        }
        
        // 如果总数超过20个，随机保留20个
        if (count($allResults) > 20) {
            $allResults = $this->getRandomElements($allResults, 20);
        }
        
        return $allResults;
    }
}

